package com.test.aware;

import com.test.processor.BeanPostProcessor;

/**
 * ApplicationContextAwareProcessor是一个BeanPostProcessor，用于处理实现了ApplicationContextAware接口的Bean。
 * 在Bean初始化之前，会调用setApplicationContext方法将ApplicationContext注入到实现了ApplicationContextAware接口的Bean中。
 */
public class ApplicationContextAwareProcessor implements BeanPostProcessor {
    private final ApplicationContext applicationContext;

    /**
     * 构造函数，接收一个ApplicationContext实例。
     * @param applicationContext Spring应用上下文，用于后续注入到实现了ApplicationContextAware接口的Bean中。
     */
    public ApplicationContextAwareProcessor(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    /**
     * 在Bean初始化之前进行处理。
     * 如果Bean实现了ApplicationContextAware接口，则调用setApplicationContext方法注入ApplicationContext。
     * @param bean 即将初始化的Bean实例。
     * @param beanName Bean名称。
     * @return 处理后的Bean实例。
     * @throws Exception 如果处理过程中发生错误则抛出异常。
     */
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws Exception {
        if (bean instanceof ApplicationContextAware) {
            ((ApplicationContextAware) bean).setApplicationContext(applicationContext);
        }
        return bean;
    }

    /**
     * 在Bean初始化之后进行处理。
     * 本方法中未实现任何操作，因为当前处理器不需要在Bean初始化后进行额外处理。
     * @param bean 已初始化的Bean实例。
     * @param beanName Bean名称。
     * @return 处理后的Bean实例。
     * @throws Exception 如果处理过程中发生错误则抛出异常。
     */
    public Object postProcessAfterInitialization(Object bean, String beanName) throws Exception {
        return bean;
    }
}
